Skip to main content

1. 智能体记忆管理与多轮对话方法

Written: 2026.06 要实现多轮对话,核心问题是 如何保存上下文记忆,让智能体对用户历史输入有“记忆”,能够根据历史消息记录回答问题

2. 记忆模型与关键组件

2.1 短期记忆(Checkpointer)

载体:Checkpointer(MemorySaverRedisSaverPostgresSaver…) 作用:把每轮消息 + 工具调用结果序列化成图状态,按 thread_id 持久化;下次传入相同 thread_id 自动续写 原理:
  • 每次你调用 graph.invoke(...) 或 graph.stream(...),LangGraph 都会维护一个状态(state)
  • 如果没有 Checkpointer,这个 state 默认只存在本次调用内,调用结束就丢掉了
  • 如果启用了 Checkpointer,它会把 state 保存到存储中(内存/数据库/文件),下次继续调用时,可以恢复之前的 state,实现“记忆”

2.2 长期记忆(BaseStore)

载体:BaseStore(InMemoryStoreRedisStoreAsyncPostgresStore…) 作用:显式保存“用户偏好”“背景事实”等高密度信息,由 LLM 主动读写;Store 支持向量检索,支持命名空间隔离 和 Checkpointer 的区别:
  • Checkpointer:保存图的运行状态(短期记忆,主要用于同一个线程连续对话)
  • Store:LangGraph 的存储模块提供持久化的键值存储,支持跨线程和会话的长期内存,适用于需要持久化数据的复杂工作流

2.3 消息裁剪( Trimming)

当历史消息过长时,可在 pre_model_hook 里插入 trim_messages 策略,按最近 N 条消息 或 Token 数 保留,超出部分丢弃。这种做法的优点是:简单、可控,保证上下文长度不超限。但缺点是:容易丢失长对话中的重要信息

2.4 消息总结(Summarization )

通过生成摘要来“压缩”历史,避免 token 爆炸
  • 定期总结:每对话 X 轮,把旧消息合并成一段摘要,再存入 memory,新的上下文里只保留摘要 + 最近消息
  • 递归总结:对摘要再继续总结,形成分层结构(像树状记忆)
  • 角色分段总结:比如只总结用户输入,系统或 AI 回复不做摘要
  • 优点:历史不会丢失,只是被压缩成更短的摘要
  • 缺点:摘要质量依赖 LLM,可能丢细节

3. 代码演示

3.1 预构建 Agent 实现记忆存储

预构建 Agent 记忆示例
执行结果如下

3.2 底层 API 实现记忆存储

定义一个聊天机器人节点函数 chatbot,它接收包含消息历史的 state,调用本地大语言模型 llm 生成回复,并返回新消息。该函数被集成到一个基于图结构的对话流程中,支持多轮对话并保持上下文
底层 API 记忆示例
执行结果如下

3.3 长期记忆+跨线程召回

整体实现步骤为:
  1. 初始化一个 InMemoryStore(或 RedisStore)
  2. 把“记忆工具”塞进智能体工具箱,让 LLM 自己决定何时存/取
  3. 命名空间按 user_id 隔离,防止用户数据串线
长期记忆示例
执行结果如下

3.4 消息裁剪

一个钩子函数 pre_model_hook,用于在模型处理前裁剪消息历史,只保留最近几条消息,避免上下文过长。它使用 trim_messages 函数按策略裁剪消息,限制总 token 数为 100,从人类用户消息开始裁剪,确保输入模型的消息列表不会超出限制
消息裁剪示例
执行结果如下

3.5 消息总结

实现了一个基于本地大语言模型的对话代理,具备上下文记忆与摘要能力。主要功能包括:
  • 加载环境变量并初始化Ollama模型;
  • 创建摘要节点以控制输入长度;
  • 定义带记忆状态的代理及会话配置;
  • 通过多轮对话测试模型对用户信息(姓名、兴趣)的记忆与理解能力
消息总结示例
执行结果如下